package tech.aistar.util.mytoken;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 JwtBuilder builder = Jwts.builder() //这里其实就是new一个JwtBuilder，设置jwt的body
 .setClaims(claims)          //如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
 .setId(id)                  //设置jti(JWT ID)：是JWT的唯一标识，根据业务需要，这个可以设置为一个不重复的值，主要用来作为一次性token,从而回避重放攻击。
 .setIssuedAt(now)           //iat: jwt的签发时间
 .setSubject(subject)//sub(Subject)：代表这个JWT的主体，即它的所有人，这个是一个json格式的字符串，可以存放什么userid，roldid之类的，作为什么用户的唯一标志。
 .signWith(signatureAlgorithm, key);//设置签名使用的签名算法和签名使用的秘钥
 */
public class CreatToken {

//    生成Token
    public static String  createToken(String uid) {
        long now = System.currentTimeMillis();//当前时间
        long exp = now + TokenEnum.time;
         JwtBuilder builder= Jwts.builder().setId(UUID.randomUUID().toString().substring(0,9)) .setSubject(uid)
            .setIssuedAt(new Date())//设置签发时间
            .signWith(SignatureAlgorithm.HS256,TokenEnum.singer)
                 .setExpiration(new Date(exp));//设置过期时间;//设置签名秘钥
         String token= builder.compact();
         return  token;
}

//解析Token
        public static String checkToken( String token) {
         try{
             Claims claims = Jwts.parser().setSigningKey("JUST10*20").parseClaimsJws(token).getBody();
             SimpleDateFormat sdf=new SimpleDateFormat("yyyy‐MM‐dd hh:mm:ss");
             return claims.getSubject();
         }catch (io.jsonwebtoken.ExpiredJwtException e){
             return TokenEnum.ExpiredError;
         }catch (Exception e){
             return TokenEnum.singerError;
        }

//            System.out.println("id:"+claims.getId());
//            System.out.println("subject:"+claims.getSubject());
//            System.out.println("IssuedAt:"+claims.getIssuedAt());
//            System.out.println("签发时间:"+sdf.format(claims.getIssuedAt()));
//            System.out.println("过期时间:"+sdf.format(claims.getExpiration()));
//            System.out.println("当前时间:"+sdf.format(new Date()) );
    }



}
